package es.armaplus.business;

import java.util.Collection;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import es.armaplus.business.exceptions.BusinessException;
import es.armaplus.commons.Constantes;
import es.armaplus.dao.BaseDAO;
import es.armaplus.dao.ClientesDao;
import es.armaplus.dao.DaoFactory;
import es.armaplus.dao.exceptions.DaoException;
import es.armaplus.ddbb.base.Clientes;

public class ClienteBusiness extends BusinessBase {

	private final static Log log = LogFactory.getLog(ClienteBusiness.class);

	public void guardar(Clientes cliente) 
		throws BusinessException, 
		DaoException {
		try {
			BaseDAO cDao = (BaseDAO) 
				DaoFactory.getDao(DaoFactory.CLIENTES_DAO);
			cDao.guardar(cliente);
		} catch (DaoException e) {
			log.error("Error en la capa DAO.", e);
			throw e;
		} catch (ClassNotFoundException e) {
			log.error("Clase DAO no encontrada.", e);
			throw new BusinessException(e);
		}
		
	}
	
	/**
	 * Obtenemos una colecci�n de clientes desde la DDBB.
	 * 
	 * @return
	 * @throws DaoException
	 * @throws BusinessException
	 */
	public Collection <Clientes> getClientes() throws DaoException, BusinessException{
		Collection <Clientes> clientes = null;
	
		/*
		 * Invocamos al DaoFactory, para tener solo una instancia de DAO.
		 */
		ClientesDao cd = null;
		try {
			cd = (ClientesDao) DaoFactory.getDao(DaoFactory.CLIENTES_DAO);
		} catch (DaoException e) {
			log.error("Error en el acceso a la base de datos.", e);
			throw e;
		} catch (ClassNotFoundException e) {
			log.error("Error en el DAO solicitado.", e);
			throw new BusinessException(e);
		}
		
		clientes = cd.getClientes();
		return clientes;
	}

	
	/**
	 * Clase para obtener un cliente desde su identificador.
	 * 
	 * @param idCliente
	 * @return
	 * @throws DaoException
	 * @throws BusinessException
	 */
	public Clientes getCliente(String idCliente) throws DaoException, BusinessException {
		log.debug(Constantes.METHOD_BEGIN);
		int idClienteInt = Integer.valueOf(idCliente);
		
		log.debug("Identificador del cliente: " + idCliente);
		log.debug("Identificador del cliente: " + idClienteInt);
		log.debug(Constantes.METHOD_END);
		return getCliente(idClienteInt);
	}
	
	/**
	 * Clase para obtener un cliente desde su identificador.
	 * 
	 * @param idCliente
	 * @return
	 * @throws DaoException
	 * @throws BusinessException
	 */
	public Clientes getCliente(int idClientes) 
		throws DaoException, 
		BusinessException {
		log.debug(Constantes.METHOD_BEGIN);

		Clientes cliente = null;
		try {
			ClientesDao clienteD = (ClientesDao) 
				DaoFactory.getDao(DaoFactory.CLIENTES_DAO);
			cliente = clienteD.getCliente(idClientes);
		} catch (DaoException e) {
			log.error("Error en el acceso a datos", e);
			throw e;
		} catch (ClassNotFoundException e) {
			log.error("Error en la clase instanciada", e);
			throw new BusinessException(e);
		}
		
		log.debug("Identificador del objeto cliente: " + cliente.getIdCliente());
		log.debug(Constantes.METHOD_END);
		return cliente;
	}

	/**
	 * Método para obtener un listado de clientes filtrado por los
	 * campos del objeto cliente.
	 * @param cliente
	 * @return
	 * @throws DaoException 
	 * @throws BusinessException 
	 */
	public List<Clientes> Buscar(Clientes cliente) throws DaoException, BusinessException {
		log.debug(Constantes.METHOD_BEGIN);

		log.debug("Nombre del cliente a filtrar: " + cliente.getNombre());
		List <Clientes> listaFiltrada = null;
		try {
			ClientesDao clienteD = (ClientesDao) 
				DaoFactory.getDao(DaoFactory.CLIENTES_DAO);
			listaFiltrada = clienteD.getBuscarClientes(cliente);
		} catch (DaoException e) {
			log.error("Error en el acceso a datos", e);
			throw e;
		} catch (ClassNotFoundException e) {
			log.error("Error en la clase instanciada", e);
			throw new BusinessException(e);
		}
		
		log.debug(Constantes.METHOD_END);
		return listaFiltrada;
	}
}
